<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 试编写‘智能重复smartRepeat函数，实现:  
    // 将3[abc]变为abcabcabc
    // 将3[2[a]2[b]]变为aabbaabbaabb

    function smartRepeat(templateStr) {
      // 指针
      var index = 0
      // 栈1 存放数字
      var stack1 = []
      // 栈2 存放临时字符串
      var stack2 = []
      // 剩余部分
      var rest = templateStr

      while (index < templateStr.length - 1) {
        // 剩余部分
        rest = templateStr.substring(index)
        // console.log(rest);
        // 看当前剩余部分是不是以数字和[开头
        if (/^\d+\[/.test(rest)) {
          // console.log('以数字开头');
          // 得到数字match正则中的()代表捕获
          let times = Number(rest.match(/^(\d+)\[/)[1])
          // 数字入栈
          stack1.push(times)
          // 空字符串入栈
          stack2.push('')
          // 让指针后移,times这个数字是多少位就往后移多少位,加一让指针指向[
          index += times.toString().length + 1
        } else if (/^\w+\]/.test(rest)) {
          // 如果这个字符是字母,那么此时就把栈顶这项改为字母
          let word = rest.match(/^(\w+)\]/)[1]
          stack2[stack2.length - 1] = word
          // 让指针后移,word是多少位就往后移多少位,加一让指针指向[
          index += word.toString().length
        } else if (rest[0] == ']') {
          // 如果这个字符是],那么就将 1,stack1弾栈,2,stack2弾栈,3,把字符串栈新栈顶的元素重复刚刚弹出的内个字符串指定次数拼接到新栈顶上
          let times = stack1.pop()
          let word = stack2.pop()
          // repeat是ES6的方法,比如'a'.repeat(3)得到'aaa'
          stack2[stack2.length - 1] += word.repeat(times)
          index++
        }
      }
      // while结束后,两个栈肯定都会剩一项
      return stack2[0].repeat(stack1[0])
    }
    let result = smartRepeat('3[2[a]2[b]]')
    console.log(result);
  </script>
</body>

</html>